﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Runtime.InteropServices;
namespace Lesson2_Stack
{
    internal class Program
    {
        static void Main(string[] args)
        {
            #region  一基础知识
            //需要用先进后出的逻辑结构的时候 就可以考虑使用Stack 
            //Stack(栈)是一种后进先出（LIFO）的数据结构，它允许我们在一端添加元素，在另一端移除元素。
            //Stack  是一个c#为我们封装好的类
            //它本质上也是object[]，但是它封装了一些方法，让我们更方便的操作
            //先存入的数据后获取，后存入的数据先获取
            #endregion

            #region  知识点二 申明

            //需要引用using System.Collections;
            Stack stack = new Stack();

            #endregion

            #region 知识点三 增取查改
            #region  增
            //压栈,添加元素从栈顶去取入栈
            stack.Push(1);
            stack.Push("厉害了");
            stack.Push("唐老师");
            stack.Push(true);


            #endregion

            #region 取  Pop
           //object v = stack.Pop();
           // Console.WriteLine(v);
           //object  v1 = stack.Pop();
           // Console.WriteLine(v1);
            #endregion

            #region 查
            //查看栈顶元素    Peak
             
            #endregion 
            //object v2 = stack.Peek();
            //Console.WriteLine(v2);
            //v2 = stack.Peek();
            //Console.WriteLine(v2);

            //查栈中是否有指定元素

             if(stack.Contains("唐老师"))
            {
                Console.WriteLine("有唐老师");
            }

            Console.WriteLine(stack.Count);
            #region   改

            stack.Clear();
            Console.WriteLine(stack.Count);
            stack.Push("哈哈哈");
            stack.Push("咯咯咯");
            stack.Push("叽叽叽");

            object v3 = stack.Peek(); 


            Console.WriteLine(v3);
            #endregion


            #region 遍历
            //得到长度
            Console.WriteLine(stack.Count);
            //因为栈特殊的存储方法 不能使用下标索引值来用for循环打印
            //foreach 来遍历
            Console.WriteLine("******************************");
            foreach (object p in stack)
            {
                Console.WriteLine(p);  //打印出来的结果依旧是从栈顶开始打印
            }
            Console.WriteLine("*************************");
            //3：还有一种遍历方法
            //将栈转化为object数组
            //遍历出来的顺序，也是从栈顶到栈底
            object[] array = stack.ToArray();   //将栈转化为数组
            for(int i = 0;i<stack.Count;i++)
            {
                Console.WriteLine(array[i]);   //打印出来的结果依旧是从栈顶开始打印
            }
            Console.WriteLine(stack.Count);
            #endregion
            //4：循环弹栈
            //配合while进行使用，采用的是边取 边用的方式

            Console.WriteLine("*************************");
            while (stack.Count > 0)
            {
                Console.WriteLine(stack.Pop());
            }

            Console.WriteLine(stack.Count);

            #endregion

            #region 装箱拆箱 
            //值类型存储  装箱
            //将值取出来使用拆箱

            #endregion
        }
    }
}
